#include <header.h>
void handler(int num){
    printf("中断退出\n");

    // Debug 此处不是有序退出
    exit(0);
}
/*
1. 完成窗口聊天：
通信方式：
- A进程和B进程负责通信，从标准输入读到的字符串通过管道发给对方
- A进程从标准输入读到的字符串发给B进程后，B打印到屏幕上。
- B进程从标准输入读到的字符串发给A进程，A打印到屏幕上。
退出方式：
任意一个进程在标准输入收到输入1，给所有进程（通信双方）发送10号信号，每个进程收到10号信号后，开始执行有序退出。
*/
int main(int argc, char* argv[]){
	ARGS_CHECK(argc, 1);

    signal(10, handler);

    int pipe_write = open("pipe1", O_WRONLY);
	ERROR_CHECK(pipe_write, -1, "open write");
    int pipe_read = open("pipe2", O_RDONLY);
	ERROR_CHECK(pipe_read, -1, "open read");

    fd_set set;
    FD_ZERO(&set);

    // 先把pid发送给对方
    pid_t pid = getpid();
    int ret1 = write(pipe_write, &pid, sizeof pid);
    ERROR_CHECK(ret1, -1, "write\n");    

    pid_t peer;
    int ret2 = read(pipe_read, &peer, sizeof peer);
    ERROR_CHECK(ret2, -1, "read\n");
    


    while(1){
        FD_SET(STDIN_FILENO, &set);
        FD_SET(pipe_read, &set);

        int res_select = select(10, &set, NULL, NULL, NULL);
        ERROR_CHECK(res_select, -1, NULL);

        // 键盘输入
        if(FD_ISSET(STDIN_FILENO, &set)){
            char buf[60] = {0};
            bzero(buf, sizeof(buf));
            read(STDIN_FILENO, buf, sizeof(buf));

            if(strcmp(buf, "1\n") == 0){
                // TODO kill 10
                kill(peer, 10);

                printf("键盘退出\n");
                break;
            }

            write(pipe_write, buf, sizeof(buf));
        }

        // 管道读入
        if(FD_ISSET(pipe_read, &set)){
            char buf[60] = {0}; 
            bzero(buf, sizeof(buf));
            int res = read(pipe_read, buf, sizeof(buf));
            if(res == 0){
                printf("对端关闭了管道 \n");
                break;
            }
            printf("B: %s \n", buf);
        }
    }

    close(pipe_read);
    close(pipe_write);

    return 0;

}